#ifndef KEYVALUE_HPP
#define KEYVALUE_HPP
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#include "config.hpp"
#include "file.hpp"

using namespace storage;
///> 键值配置 以文件的形式保存
namespace configraion
{
    class keyvalue:public config
    {
        protected:
            const char *mFileName;
            file::DiskTPDF mDisk;
			bool mIsRecord;
			uint16_t mRecordId;
				
        public:
            typedef struct
			{
			    uint32_t uiKey;     		///<键值
			    uint16_t usLen;    			///<数据长度
			    uint32_t uiOffset;			///<偏移量
			}KeyDemoTPDF;///<键值模板定义

            const KeyDemoTPDF *KeyDemo;	///<键值模板
            uint8_t KeyLen;							///<键值模板长度
						
						/** 
						* @brief      	初始化记录
						* @param[in]   	tKeyValueDemo		键值模板
						* @param[in]   	usMaxRecord			最大记录条数
						* @retval    	 	None
						*/
			static bool ReocrdInit(keyvalue *tKeyValueDemo, uint16_t usMaxRecord);
						
						/** 
						* @brief      	创建记录型
						* @param[in]   	tDisk		盘
						* @param[in]   	usReocrdId	记录ID
						* @retval    	 	None
						*/
            keyvalue(file::DiskTPDF tDisk, const char *cFileName);
						
						/** 
						* @brief      	构造函数
						* @param[in]   	tDisk		盘
						* @param[in]   	cFileName	文件名
						* @retval    	 	None
						*/
			keyvalue(file::DiskTPDF tDisk, uint16_t usReocrdId);
						
						/** 
						* @brief      	保存
						* @param[in]   	tag		实体对象
						* @retval    	 	操作结果
						*/
            virtual bool Save(void *tag);
						
						/** 
						* @brief      	打开文件
						* @param[out]   tag		实体对象
						* @retval    	 	操作结果
						*/
            virtual bool Open(void *tag);
						
						/** 
						* @brief      	打开记录
						* @param[out]   tag		实体对象
						* @retval    	 	操作结果
						*/
            virtual bool Open(void *tag, uint16_t usIndex);
			virtual bool Save(void);
            virtual bool Open(void);
    };
}

#endif
